import './tiows.js'
import Fingerprint2 from './fingerprint2.min.js'

tio.distTio = {}

tio.distTio.isManage = false // 是否为管理端，客户端false

tio.distTio.tioConfig = {
  // ic消息
  ic: function(data) {
    tio.distTio._this.$message.success('收到来自[' + data.bsid + ']客户端[' + data.data.type + ']类型消息：' + data.data.content)
    console.log(data)
  },
  // ic_persistence消息
  ic_persistence: function(data) {
    tio.distTio._this.$message.error('收到来自[' + data.bsid + ']客户端[' + data.data.type + ']类型消息：' + data.data.content)
    console.log(data)
  },
  // im_persistence即时通消息
  im_persistence: function(data) {
    if (icLayim) {
      const res = {
        avatar: 'layim/css/modules/layim/skin/defaultAvatar.png',
        content: data.data.content,
        fromid: data.data.im.from.id,
        id: data.data.im.to.type == 'group' ? data.data.im.to.id : data.data.im.from.id, // 如果为组，就获取组id；否则获取发送者id
        mine: false,
        timestamp: data.data.im.to.timestamp,
        type: data.data.im.to.type,
        username: data.data.im.from.username
      }
      if (res.type == 'friend' || res.type == 'group') {
        icLayim.getMessage(res)
      } else {
        icLayim.setFriendStatus(res.id, res.content)
      }
    }
  }
}

/**
 * @Author: Charles
 * @Date: 2021/10/22 14:12
 * @Description: 1 自定义处理器
 */
tio.distTio.icHandler = function() {
  this.onopen = function(event, ws) {
    // tio.distTio._this.$message.success('消息中心连接成功')
    window.distIc.websocketOpenState = true
    console.log('onopen: 消息中心连接成功')
  }
  this.onmessage = function(event, ws) {
    // console.log('onmessage', event)
    tio.distTio.eventHub.$emit('_DIST_IC_INFO_', event.data)
    const data = JSON.parse(event.data)
    // 根据消息来源处理操作
    if (tio.distTio.isManage && window.distIc.websocketOpenState) {
      tio.distTio.tioConfig.onAfterHnadshked = tio.distTio.eventHub.$emit('_REFRESH_DIST_IC_ALL_')
      tio.distTio.tioConfig.onClose = tio.distTio.eventHub.$emit('_REFRESH_DIST_IC_ALL_')
    }
    if (data.type === 'backMsg') {
      tio.distTio.eventHub.$emit('_REFRESH_TODO_BOX_')
      tio.distTio.eventHub.$emit('_CALL_BACK_MESSAGE_', data)
    }
    if (data && data.type) {
      tio.distTio.tioConfig[data.type] ? tio.distTio.tioConfig[data.type](data) : console.log(data.type)
    }
  }
  this.onclose = function(e, ws) {
    console.log('onclose')
    if (window.distIc.websocketOpenState) {
      tio.distTio.eventHub.$emit('_CLOSE_DIST_IC_ALL_')
    }
  }
  this.onerror = function(e, ws) {
    console.log('onerror')
    tio.distTio._this.$message.error('消息中心连接失败')
  }
  this.ping = function(ws) {
    var msg = {
      mode: 'heartbeat'
    }
    ws.send(JSON.stringify(msg))
  }
}
/**
 * @Author: Charles
 * @Date: 2021/10/22 14:21
 * @Description: 2 根据连接信息进行连接(0 需要先全局引入tiows.js)
 */
let tioWs
tio.distTio.initWs = function(_param) {
  const config = {
    // ws 或 wss
    ws_protocol: 'ws',
    // 消息中心服务器地址
    ip: _param.serverIp,
    // 消息中心服务器端口
    port: _param.serverPort,
    // 消息中心连接参数
    paramStr: 'icMark=distIc',
    // 心跳超时时间，单位：毫秒
    heartbeatTimeout: 60000,
    // 连接失败重连间隔时间，单位：毫秒
    reconnInterval: 3000,
    // 'blob' or 'arraybuffer';//arraybuffer是字节
    binaryType: 'blob',
    // 自定义处理器，根据处理器处理连接后的交互
    handler: new tio.distTio.icHandler(),
    // 暂无用处
    param: ''
  }
  // 拼接请求参数
  if (_param) {
    for (var key in _param) {
      const value = _param[key]
      if (value.length > 0) {
        config.paramStr = config.paramStr + '&' + key + '=' + value
      }
    }
  }
  tioWs = new tio.ws(config.ws_protocol, config.ip, config.port, config.paramStr, config.param, config.handler, config.heartbeatTimeout, config.reconnInterval, config.binaryType)
  tioWs.connect()
}

function getSingleId() {
  const excludes = { enumerateDevices: true }
  const options = { excludes: excludes }
  return new Promise((resolve, reject) => {
    Fingerprint2.get(options, function(components) {
      // 参数
      const values = components.map(function(component) {
        return component.value
      })
      // 指纹(单机唯一标识)
      resolve(Fingerprint2.x64hash128(values.join(''), 31))
    })
  })
}

/*
 * 启动IM方法
 * */
let icLayim

function startIM(userId) {
  var serverDaprest = window.distIc.httpServiceUrl // 后端服务地址

  layui.use('layim', function(layim) {
    icLayim = layim
    layim.config({
      init: {
        // url: serverDaprest + 'pcc/common/v1/im/getInitList',
        url: serverDaprest + 'ic/im/getUsersAndGroupsByName',
        data: { userId: userId }
      },
      brief: false, // 查看群员接口
      members: {
        url: serverDaprest + 'ic/im/getGroupUserByGroupId',
        data: {}
      },
      group: {
        addGroup: serverDaprest + 'ic/im/saveGroupWithUsers?userIds=' + userId, // 添加群组
        addMembers: serverDaprest + 'ic/im/saveUserToGroup', // 添加成员
        removeMembers: serverDaprest + 'ic/im/removeUserFromGroup', // 删除成员
        getMembers: serverDaprest + 'ic/im/getGroupUserByGroupId', // 获取成员
        type: 'POST'
      },
      getMsgRecord: {
        url: serverDaprest + 'ic/im/getMsgRecord' // 获取聊天记录
      },
      uploadImage: {
        url: serverDaprest + 'pcc/common/v1/im/uploadFile?userId=' + userId,
        type: '' // 默认post
      },
      uploadFile: {
        url: serverDaprest + 'pcc/common/v1/im/uploadFile?userId=' + userId,
        type: '' // 默认post
      },
      uploadAvatar: {
        url: serverDaprest + 'pcc/common/v1/im/uploadAvatar?userId=' + userId,
        type: '' // 默认post
      },
      min: true,
      title: userId, // 主面板最小化后显示的名称
      addGroup: layui.cache.dir + 'css/modules/layim/html/find.html', // 发现页面地址，若不开启，剔除该项即可
      background: true, // 更换背景
      chatLog: layui.cache.dir + 'css/modules/layim/html/chatlog.html', // 聊天记录页面地址，若不开启，剔除该项即可
      copyright: true, // 是否授权
      right: '30px',
      notice: true // 开启桌面消息提醒
    })

    // 监听IM聊天消息，再发送消息给IC
    layim.on('sendMessage', function(data) {
      var obj = {
        from: {
          id: data.mine.id,
          username: data.mine.username
        },
        to: {
          id: data.to.id,
          name: data.to.groupname,
          type: data.to.type,
          username: data.to.username,
          timestamp: new Date().getTime() // 当前消息发送时间
        }
      }
      // 默认联系人data.to.type=friend
      var msg = {
        target: data.to.id,
        mode: 'user',
        msgBody: { type: 'im_persistence', data: { type: '即时通消息', content: data.mine.content, im: obj } }
      }
      // 判断是否群组
      if (data.to.type == 'group') {
        msg.mode = 'group'
        msg.target = data.to.id // 群组id
      }
      // 发送消息给ic
      tioWs.send(JSON.stringify(msg))
    })

    // 监听在线状态的切换事件
    layim.on('online', function(data) {
      console.log(data)
    })
    // layim建立就绪
    layim.on('ready', function() {
      // 获取离线消息
    })
    // 监听查看群员
    layim.on('members', function(data) {
      console.log(data)
    })
    layim.on('add', function(data) {
      console.log(data)
    })
    // 监听聊天窗口的切换
    layim.on('chatChange', function(data) {
      console.log(data)
    })
    // 监听签字
    layim.on('sign', function(data) {
      console.log(data)
    })
    // 监听头像切换
    layim.on('changeAvatar', function(data) {
      console.log(data)
    })
    // 监听窗口关闭
    layim.on('chatClose', function(data) {
      console.log(data)
    })
  })
}

// 握手
tio.distTio.handshake = function(_this, _param) {
  tio.distTio._this = _this
  // 开启im
  // startIM(_param.userId)
  // 等待im获取人员接口调用之后再开启ic
  getSingleId().then(function(resp) {
    _param.singleId = resp
    tio.distTio.initWs(_param) // 单机唯一标识,当前用户名
  })
}
